package satk.database;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import satk.objetos.Institucion;
import satk.beans.interfaces.IntControlManagerDB;

/**
 *
 * @author Sergio Flores Genis <http://sergenis.x10.mx>, 16/04/2011
 */
public class ManagerInstitucion extends DBManager
        implements IntControlManagerDB<Institucion> {

    public ManagerInstitucion(Connection c) {
        super(c);
    }

    public ManagerInstitucion() {
        super();
    }

    @Override
    public List<Institucion> getAll() {
        LinkedList<Institucion> list = null;
        list = new LinkedList<Institucion>();
        String query = "SELECT * FROM c_institucion ORDER BY nomc_institucion ASC;";
        try {
            ResultSet r = this.select(query);
            while (r.next()) {
                int identificador = r.getInt("idc_institucion");
                String nombre = r.getString("nomc_institucion");
                String sigla = r.getString("sigc_institucion");
                list.add(new Institucion(identificador, nombre, sigla));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.SEVERE,
                    "Error al obtener las instituciones", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            this.closeConexion();
        }
        return list;
    }

    @Override
    public int add(Institucion inst) throws SQLException {
        String query = "INSERT INTO c_institucion ("
                + " nomc_institucion, sigc_institucion) VALUES (?, ?); ";

        DBManager.Prepare parametros = new DBManager.Prepare(2);
        parametros.add(inst.getNombre(), Types.VARCHAR);
        parametros.add(inst.getSiglas(), Types.VARCHAR);

        int resp = this.edit(query.toString(), parametros);
        inst.setIdentificador(getLastIdInsert());
        this.closeConexion();
        return resp;
    }

    @Override
    public Institucion getById(long idInst) {
        String query = "SELECT * FROM c_institucion WHERE (idc_institucion = ?) LIMIT 1;";
        DBManager.Prepare parametro = new DBManager.Prepare(1);
        parametro.add(idInst, Types.INTEGER);

        Institucion inst = new Institucion(0, "", "");
        try {
            ResultSet r = this.select(query, parametro);
            while (r.next()) {
                int identificador = r.getInt("idc_institucion");
                String nombre = r.getString("nomc_institucion");
                String sigla = r.getString("sigc_institucion");
                inst = (new Institucion(identificador, nombre, sigla));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.SEVERE,
                    "Error al obtener las instituciones", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            this.closeConexion();
        }
        return inst;
    }

    @Override
    public int update(Institucion o, Institucion n) throws SQLException {
        DBManager.PrepareUpdate parametros = new DBManager.PrepareUpdate(3);
        if (!n.getNombre().equals(o.getNombre())) {
            parametros.add("nomc_institucion", n.getNombre(), Types.VARCHAR);
        }
        if (!n.getSiglas().equals(o.getSiglas())) {
            parametros.add("sigc_institucion", n.getSiglas(), Types.VARCHAR);
        }

        if (parametros.getPrepare().isEmpty()) {return -2;}
        String query = String.format("UPDATE c_institucion %s WHERE (idc_institucion = ?);",
                parametros.getSet());
        parametros.getPrepare().add(n.getIdentificador(), Types.INTEGER);

        int resp = this.edit(query, parametros.getPrepare());
        this.closeConexion();
        return resp;
    }

    /** <h1>No soportado</h1> */
    @Override
    public int remove(Institucion o) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
